﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace Webcam_Filter
{
    class HistogramFilter : Filter
    {
        protected override void runfilter(byte[] rgbValues, int hoogte, int breedte, string[] args)
        {
            //initialiseren...
            int[] rood = new int[256];
            int[] blauw = new int[256];
            int[] groen = new int[256];
            
            int breedteARGB = breedte *4;
            int totaalAantalPixels = hoogte*breedteARGB;

            //pixelwaardes optellen...
            for (int i = 0; i < totaalAantalPixels; i += 4)
            {
                (blauw[rgbValues[i]]) = blauw[rgbValues[i]] + 1;
                (groen[rgbValues[i + 1]]) = groen[rgbValues[i+1]] + 1;
                (rood[rgbValues[i + 2]]) = rood[rgbValues[i+2]] + 1;
            }

            //pixelwaardes omzetten naar percentages...
            for(int i = 0; i < rood.Length; i++){
                rood[i] = (rood[i]/(totaalAantalPixels/5000));
            }
            for(int i = 0; i < blauw.Length; i++){
                blauw[i] = (blauw[i]/(totaalAantalPixels/5000));
            }
            for(int i = 0; i < groen.Length; i++){
                groen[i] = (groen[i]/(totaalAantalPixels/5000));
            }

            //doelveld maken van 312*259 pixels...
            int hoogteVeld = 312;
            int breedteVeld = 260;
            int breedteVeldARGB = breedteVeld * 4;
            int linkerBovenHoekVeld = totaalAantalPixels - ((hoogteVeld * breedteARGB) + breedteVeldARGB) - 4;

  
            //histogrammen tekenen
            //eerst rood histogram...

            int roodWaardePointer = 0;
            int huidigePlaatsRoodH = linkerBovenHoekVeld + ((hoogteVeld) * breedteARGB);
            
            while(roodWaardePointer < rood.Length-1){
                huidigePlaatsRoodH += 4;
                roodWaardePointer++;

                int huidigePlaatsRoodV = huidigePlaatsRoodH;
                for (int i = 0; i < rood[roodWaardePointer]; i++)
                {
                    if (huidigePlaatsRoodV > breedteARGB)
                    {
                        rgbValues[huidigePlaatsRoodV] = 0;
                        rgbValues[huidigePlaatsRoodV + 1] = 0;
                        rgbValues[huidigePlaatsRoodV + 2] = 255;
                        rgbValues[huidigePlaatsRoodV + 3] = 255;
                        huidigePlaatsRoodV -= breedteARGB;
                    }
                }
            }

            //blauw histogram...

            int blauwWaardePointer = 0;
            int huidigePlaatsBlauwH = linkerBovenHoekVeld + (((hoogteVeld/3)*2) * breedteARGB);

            while (blauwWaardePointer < groen.Length - 1)
            {
                huidigePlaatsBlauwH += 4;
                blauwWaardePointer++;

                int huidigePlaatsBlauwV = huidigePlaatsBlauwH;
                for (int i = 0; i < blauw[blauwWaardePointer]; i++)
                {
                    if (huidigePlaatsBlauwV > breedteARGB)
                    {
                        rgbValues[huidigePlaatsBlauwV] = 255;
                        rgbValues[huidigePlaatsBlauwV + 1] = 0;
                        rgbValues[huidigePlaatsBlauwV + 2] = 0;
                        rgbValues[huidigePlaatsBlauwV + 3] = 255;
                        huidigePlaatsBlauwV -= breedteARGB;
                    }
                }
            }


            //groen histogram...
            int groenWaardePointer = 0;
            int huidigePlaatsGroenH = linkerBovenHoekVeld + ((hoogteVeld/3) * breedteARGB);

            while (groenWaardePointer < groen.Length - 1)
            {
                huidigePlaatsGroenH += 4;
                groenWaardePointer++;

                int huidigePlaatsGroenV = huidigePlaatsGroenH;
                for (int i = 0; i < groen[groenWaardePointer]; i++)
                {
                    if (huidigePlaatsGroenV > breedteARGB)
                    {
                        rgbValues[huidigePlaatsGroenV] = 0;
                        rgbValues[huidigePlaatsGroenV + 1] = 255;
                        rgbValues[huidigePlaatsGroenV + 2] = 0;
                        rgbValues[huidigePlaatsGroenV + 3] = 255;
                        huidigePlaatsGroenV -= breedteARGB;
                    }
                }
            }
        }
    }
}
